///import core
///commands 悬浮工具栏
///commandsName  AutoFloat,autoFloatEnabled
///commandsTitle  悬浮工具栏
/**
 *  modified by chengchao01
 *  注意： 引入此功能后，在IE6下会将body的背景图片覆盖掉！
 */
UE.plugins["autofloat"] = function () {
    var me = this,
        lang = me.getLang();
    me.setOpt({
        topOffset: 0
    });
    var optsAutoFloatEnabled = me.options.autoFloatEnabled !== false,
        topOffset = me.options.topOffset;

    //如果不固定toolbar的位置，则直接退出
    if (!optsAutoFloatEnabled) {
        return;
    }
    var uiUtils = UE.ui.uiUtils,
        LteIE6 = browser.ie && browser.version <= 6,
        quirks = browser.quirks;

    function checkHasUI() {
        if (!UE.ui) {
            alert(lang.autofloatMsg);
            return 0;
        }
        return 1;
    }

    function fixIE6FixedPos() {
        var docStyle = document.body.style;
        docStyle.backgroundImage = 'url("about:blank")';
        docStyle.backgroundAttachment = "fixed";
    }

    var bakCssText,
        placeHolder = document.createElement("div"),
        toolbarBox,
        orgTop,
        getPosition,
        flag = true; //ie7模式下需要偏移
    function setFloating() {
        var toobarBoxPos = domUtils.getXY(toolbarBox),
            origalFloat = domUtils.getComputedStyle(toolbarBox, "position"),
            origalLeft = domUtils.getComputedStyle(toolbarBox, "left");
        toolbarBox.style.width = toolbarBox.offsetWidth + "px";
        toolbarBox.style.zIndex = me.options.zIndex * 1 + 1;
        toolbarBox.parentNode.insertBefore(placeHolder, toolbarBox);
        if (LteIE6 || (quirks && browser.ie)) {
            if (toolbarBox.style.position != "absolute") {
                toolbarBox.style.position = "absolute";
            }
            toolbarBox.style.top =
                (document.body.scrollTop || document.documentElement.scrollTop) -
                orgTop +
                topOffset +
                "px";
        } else {
            if (browser.ie7Compat && flag) {
                flag = false;
                toolbarBox.style.left =
                    domUtils.getXY(toolbarBox).x -
                    document.documentElement.getBoundingClientRect().left +
                    2 +
                    "px";
            }
            if (toolbarBox.style.position != "fixed") {
                toolbarBox.style.position = "fixed";
                toolbarBox.style.top = topOffset + "px";
                (origalFloat == "absolute" || origalFloat == "relative") &&
                parseFloat(origalLeft) &&
                (toolbarBox.style.left = toobarBoxPos.x + "px");
            }
        }
    }

    function unsetFloating() {
        flag = true;
        if (placeHolder.parentNode) {
            placeHolder.parentNode.removeChild(placeHolder);
        }

        toolbarBox.style.cssText = bakCssText;
    }

    me.unsetFloating = unsetFloating;

    function updateFloating() {
        var rect3 = getPosition(me.container);
        var offset = me.options.toolbarTopOffset || 0;
        if (rect3.top < 0 && rect3.bottom - toolbarBox.offsetHeight > offset) {
            setFloating();
        } else {
            unsetFloating();
        }
    }

    var defer_updateFloating = utils.defer(
        function () {
            updateFloating();
        },
        browser.ie ? 200 : 100,
        true
    );

    me.addListener("destroy", function () {
        domUtils.un(window, ["scroll", "resize"], updateFloating);
        me.removeListener("keydown", defer_updateFloating);
    });

    me.addListener("ready", function () {
        if (checkHasUI(me)) {
            //加载了ui组件，但在new时，没有加载ui，导致编辑器实例上没有ui类，所以这里做判断
            if (!me.ui) {
                return;
            }
            getPosition = uiUtils.getClientRect;
            toolbarBox = me.ui.getDom("toolbarbox");
            orgTop = getPosition(toolbarBox).top;
            bakCssText = toolbarBox.style.cssText;
            placeHolder.style.height = toolbarBox.offsetHeight + "px";
            if (LteIE6) {
                fixIE6FixedPos();
            }
            domUtils.on(window, ["scroll", "resize"], updateFloating);
            me.addListener("keydown", defer_updateFloating);

            me.addListener("beforefullscreenchange", function (t, enabled) {
                if (enabled) {
                    unsetFloating();
                }
            });
            me.addListener("fullscreenchanged", function (t, enabled) {
                if (!enabled) {
                    updateFloating();
                }
            });
            me.addListener("sourcemodechanged", function (t, enabled) {
                setTimeout(function () {
                    updateFloating();
                }, 0);
            });
            me.addListener("clearDoc", function () {
                setTimeout(function () {
                    updateFloating();
                }, 0);
            });
        }
    });
};
